Flow TSNMF Model

In [1]:
from tsnmf_edit import TSNMF
from sklearn.feature_extraction.text import TfidfTransformer
import pandas as pd
import numpy as np
import geopandas as gpd
import matplotlib.pyplot as plt
import joblib
import matplotlib as mpl
from scipy.sparse import load_npz
import ujson as json
import seaborn as sns
from scipy.sparse import csr_matrix
from sklearn.preprocessing import normalize, MinMaxScaler

# para MinMax Scaler
sup_min_bubble_size = 0
sup_max_bubble_size = 70

sns.set(style='ticks', palette='magma', context='notebook', font='Linux Biolinum O')
#%config InlineBackend.figure_format = 'retina'
%matplotlib inline

def normalize_dataframe_rows(df):
    df = pd.DataFrame(normalize(df, norm='l1'), index=df.index, columns=df.columns)
    return df

def plot_component(column, **kwargs):
    df = kwargs.pop('data')
    ax = plt.gca()
    #urban_context.plot(ax=ax, facecolor='#efefef', edgecolor='#cfcfcf')
    #highways.plot(ax=ax, color='#333333', linewidth=1)
    #primary.plot(ax=ax, color='orange', linewidth=1)
    #cycleways.plot(ax=ax, color='lime', linewidth=1)

    scaler = kwargs.pop('scaler', None)
    sizes = scaler.transform(np.sqrt(df[column].values.reshape(-1, 1)))
    ax.scatter(df.geometry.x, df.geometry.y, s=sizes, color='#4B0082', alpha=0.5, zorder=20)
    plt.axis('off')
    plt.axis('equal')
In [2]:
RM_map = gpd.read_file('maps/R13/LIMITE_URBANO_CENSAL_C17.shp')
RM_map['COMUNA'] = RM_map['COMUNA'].astype(np.int)
RM_map = RM_map.set_index('COMUNA')
# Descarto algunas zonas
RM_map2 = RM_map[RM_map.NOM_CATEG=='CIUDAD']
RM_map = RM_map2[~RM_map2.NOM_COMUNA.isin(['CURACAVÍ', 'TILTIL', 'SAN JOSÉ DE MAIPO', 'PIRQUE', 'EL MONTE','TALAGANTE','MELIPILLA', 'LAMPA', 'COLINA', 'CALERA DE TANGO', 'PEÑAFLOR',  'BUIN', 'ISLA DE MAIPO', 'PAINE'])]#rm_map[rm_map.NOM_COMUNA==rm_map.URBANO]
RM_map = RM_map[~RM_map.URBANO.isin(['CIUDAD DEL VALLE'])]
RM_map = gpd.read_file('maps/R13/LIMITE_URBANO_CENSAL_C17.shp')
RM_map['COMUNA'] = RM_map['COMUNA'].astype(np.int)
RM_map = RM_map.set_index('COMUNA')
# Descarto algunas zonas
RM_map2 = RM_map[RM_map.NOM_CATEG=='CIUDAD']
RM_map = RM_map2[~RM_map2.NOM_COMUNA.isin(['CURACAVÍ', 'TILTIL', 'PADRE HURTADO', 'SAN JOSÉ DE MAIPO', 'PIRQUE', 'EL MONTE','TALAGANTE','MELIPILLA', 'COLINA', 'CALERA DE TANGO', 'PEÑAFLOR',  'BUIN', 'ISLA DE MAIPO', 'PAINE'])]#rm_map[rm_map.NOM_COMUNA==rm_map.URBANO]
RM_map = RM_map[~RM_map.URBANO.isin(['CIUDAD DEL VALLE', 'BATUCO', 'CHICAUMA', 'LAMPA'])]
RM_map.boundary.plot(color='black', alpha=0.2)
findfont: Font family ['Linux Biolinum O'] not found. Falling back to DejaVu Sans.
Out[2]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fdce82de590>

Importamos datos de las Zonas

Al hacer prediciones del mnlogit model, el input necesita tener las features correspondientes a la formula utilizada en EOD_Model_v2.ipynb.

Por ahora zone_income es el único modificable

In [3]:
# Importamos el id, area, la comuna a que pertenece y la geometria
zones = gpd.read_file('json/urban_zones_2016.json').set_index('ID').to_crs({'init': 'epsg:5361'})
# Distancias entre un origen y un destino
zone_distances = pd.read_csv('2017_results/zone_distances.csv.gz', index_col=['ZonaOrigen', 'ZonaDestino'])
# Periodo en el que se realizo el viaje
zone_matrix = pd.read_json('2017_results/od_matrix_per_zone.json.gz', lines=True)
period_matrices = zone_matrix.groupby(['period', 'origin_zone', 'destination_zone'])['trip_count'].mean()
/home/vnavarro/.local/lib/python3.7/site-packages/pyproj/crs/crs.py:55: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
  return _prepare_from_string(" ".join(pjargs))
In [4]:
# Media de Ingresos por Hogar segun zona
zone_income = pd.read_csv('2017_results/zone_income.csv.gz', index_col='Zona')
zone_mindist  =  pd.read_csv('2020_results/mindist_zonahogar.csv', index_col='Zona')

Importamos las Torres y Waypoints

Al usar TSNMF el modelo utiliza los waypoints. En el resultado final la matriz W almacena las torres.

In [5]:
# Torres de telefonía ya etiquetadas
towers =  gpd.read_file('2017_results/towers_with_labels.geo.json').set_index('tower')
# Puntos de referencia entre zonas
waypoints = load_npz('2017_results/waypoints_between_zones.npz')
waypoint_index = pd.read_json('2017_results/waypoints_between_zones_index.json.gz', lines=True)
periods = waypoint_index.period.unique()
# Hora peak mañana y tarde
relevant_periods = ['morning_peak_1', 'afternoon_peak']
period = relevant_periods[0] # Para iniciar iteracion

idx_to_tower = dict(zip(range(len(towers)), towers.index.values))
tower_idx = dict(zip(towers.index.values, range(len(towers))))
In [6]:
def find_tower_labels(keys):
    return set(towers[keys].sum(axis=1)
            .pipe(lambda x: x[x > 0].copy())
            .index.values)

rail_keys = find_tower_labels(['within_metro', 'near_surface_metro', 'near_train'])
bus_keys = find_tower_labels(['near_bus_corridor', 'near_bus_routes'])
motorized_keys = find_tower_labels(['near_highways', 'near_primary_streets', 'near_secondary_streets'])
non_motorized_keys = find_tower_labels(['near_cycleways', 'near_pedestrian_streets'])
taxi_keys = find_tower_labels(['near_share_taxi'])

labeled_keys = {
    'bus': bus_keys - (motorized_keys | rail_keys),
    'rail': rail_keys - (bus_keys | motorized_keys),
    #'public': (bus_keys | rail_keys) - (motorized_keys | pedestrian),
    'private': motorized_keys - (bus_keys | taxi_keys | rail_keys | non_motorized_keys),
    'shared_taxi': taxi_keys - (motorized_keys | rail_keys | non_motorized_keys),
    'taxi_public': ((bus_keys | rail_keys ) & taxi_keys) - (motorized_keys | non_motorized_keys)
    #'non_motorized': non_motorized_keys - (bus_keys | rail_keys | motorized_keys | pedestrian)
}

topic_ids = dict(zip(labeled_keys.keys(), range(len(labeled_keys))))

labels = []
for idx in tower_idx:
    #print(idx)
    tower_label = []
    for topic_name, topic_id in topic_ids.items():
        if idx in labeled_keys[topic_name]:
            tower_label.append(topic_id)
    labels.append(tower_label)

Se plotean las torres sobre la Región Metropolitana

In [7]:
colors = sns.color_palette('Set2', n_colors=len(labeled_keys)+2)
colors = ['green', 'pale red', 'windows blue', 'dusty purple', 'amber']
colors =sns.xkcd_palette(colors)
color_map = dict(zip(labeled_keys.keys(), colors))
plt.figure(figsize=(12,12))
ax1 = plt.subplot2grid((5,5), (0,0), colspan=4, rowspan=5)
ax1.axis('off')
ax_dict = {'all' : ax1}
for i, k in enumerate(labeled_keys.keys()):
    ax_dict[k] = plt.subplot2grid((5,5), (i,4))
    ax_dict[k].axis('off')
    
for label, tower_ids in labeled_keys.items():
    towers.loc[tower_ids].plot(ax=ax1, alpha=1, marker='.', markersize=100, zorder=30, 
            linewidth=1, label=label, color=color_map[label])
    ax1.set_title("Towers in RM")
    ax1.legend(loc=3)
    RM_map.boundary.plot(color='gray', alpha=0.2, ax=ax1)
    
    towers.loc[tower_ids].plot(ax=ax_dict[label], alpha=1, marker='.', markersize=10, zorder=30, 
            linewidth=1, label=label, color=color_map[label])
    ax_dict[label].set_title(label)
    RM_map.boundary.plot(color='black', alpha=0.2, ax=ax_dict[label], linewidth=0.5)
findfont: Font family ['Linux Biolinum O'] not found. Falling back to DejaVu Sans.

Se importa el modelo MNLogit

Dicho modelo proviene de EOD_Model.ipynb

In [8]:
with open('2020_results/mnlogit_column_names.json') as f:
    mnlogit_column_names = json.load(f)
    
#mnlogit_column_names[-1] = 'shared_taxi'
mnlogit = joblib.load('2020_results/mnlogit_zone_model_instance.joblib.gz')

mnlogit_column_names
Out[8]:
['motorized', 'non_motorized', 'public', 'shared_taxi', 'taxi_public']

Ejecutamos la iteración por periodo

In [9]:
i=0
for period in periods:
    #if period!='afternoon_peak': break
    print("Actual period:", period)
    # work only on this period
    waypoint_periods = waypoint_index[waypoint_index.period == period]
    # we use a binary matrix this time! we are interested in routes, not in magnitudes
    to_factorize = csr_matrix(waypoints[waypoint_periods.index].T, copy=True)
    to_factorize[to_factorize > 0] = 1
    
    # these are the static values used to evaluate the prior from EOD
    zone_features = (waypoint_periods
        .join(zone_income, on='origin_zone', how='inner')
        .rename(columns={'mean_home_income': 'origin_income'})
        .join(zone_income, on='destination_zone', how='inner')
        .rename(columns={'mean_home_income': 'destination_income'})
        .join(zone_distances, on=['origin_zone', 'destination_zone'], how='inner')
        .join(zone_mindist.add_prefix('origen_'), on='origin_zone', how='inner')
        .join(zone_mindist.add_prefix('destino_'), on='destination_zone', how='inner')
        .pipe(lambda x: x[x['origin_zone']!=x['destination_zone']])
                    )
    
    # perform the factorization
    nmf = TSNMF(n_components=len(topic_ids), init='random', verbose=1, tol=1e-06, random_state=6, max_iter=500)
    W = nmf.fit_transform(to_factorize, labels)

    tower_mode = pd.DataFrame(normalize(W, norm='l1') , index=towers.index.tolist(), columns= labeled_keys.keys())
    tower_mode.index.name = 'tower'

    # plot the tower factorization for inspection
    sup_tower_components = (tower_mode
                            .reset_index()
                            .pipe(lambda x: pd.melt(x, id_vars='tower')))

    sup_scaler = MinMaxScaler(feature_range=(sup_min_bubble_size, sup_max_bubble_size))
    sup_scaler.fit(np.sqrt(sup_tower_components.value.values.reshape(-1, 1)))

    sup_geodf = gpd.GeoDataFrame(sup_tower_components.join(towers, on='tower'), crs={'init': 'epsg:4326'})
    g = sns.FacetGrid(data=sup_geodf, col='variable', height=7, aspect=1, sharex=False, sharey=False)
    for ax in g.axes.ravel():
        RM_map.boundary.plot(color='black', alpha=0.2, ax=ax)
    g.map_dataframe(plot_component, 'value', scaler=sup_scaler)

    # retrieve the zone-mode matrix
    flow_mode = (pd.DataFrame(nmf.components_.T , 
                              index=waypoint_periods.index, 
                              columns= labeled_keys.keys())
                 .join(waypoint_periods)
                 .set_index(['origin_zone', 'destination_zone'])
                 .drop(['index', 'period'], axis=1)
    )
    

    # estimate a probability for non motorized trips.
    # we use a logistic function. the 0.5 prob for non motorized trips is assigned at 200 meters.
    non_motorized_p = 1 - 1 / (1 + np.exp(-(zone_distances.loc[flow_mode.index].distance - 0.2)))
    non_motorized_p.name = 'non_motorized'

    # build the evidence matrix with with the zone-mode matrix and non-motorized probabilities
    flow_evidence = (flow_mode
                      .pipe(normalize_dataframe_rows)
                      .mul(1 - non_motorized_p.values, axis='rows')
                      .assign(non_motorized=non_motorized_p.values)
                      .assign(public=lambda x: x['bus'] + x['rail'])
                      .drop(['bus', 'rail'], axis=1)
                      .rename(columns={'private': 'motorized'})
                      [mnlogit_column_names]
    )

    # plot the evidence modal partition for inspection
    flow_evidence_trips = flow_evidence.mul(period_matrices.loc[period], axis='index')

    (flow_evidence_trips
     .join(zones.Comuna, on='origin_zone')
     .groupby('Comuna')
     .sum()
     .pipe(normalize_dataframe_rows)
     .sort_values('motorized')
     .plot(kind='bar', stacked=True, figsize=(14, 7), cmap='viridis', width=0.9, legend=False)
    )
    plt.title('Evidence')
    plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5), frameon=False)
    sns.despine()

    # estimate the prior information using the EOD mnlogit model
    zone_priors = mnlogit.predict(zone_features.set_index(['origin_zone', 'destination_zone']))
    zone_priors.columns = mnlogit_column_names
    flow_priors = zone_priors.loc[flow_evidence.index]

    # plot the prior partition for inspection
    flow_prior_trips = flow_priors.mul(period_matrices.loc[period], axis='index')

    (flow_prior_trips
     .join(zones.Comuna, on='origin_zone')
     .groupby('Comuna')
     .sum()
     .pipe(normalize_dataframe_rows)
     .sort_values('motorized')
     .plot(kind='bar', stacked=True, figsize=(14, 7), cmap='viridis', width=0.9, legend=False)
    )
    plt.title('Prior')
    plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5), frameon=False)
    sns.despine()

    # use bayes theorem to estimate the posterior modal partition
    denominator = flow_priors.mul(flow_evidence).sum(axis=1)
    flow_posteriors = flow_evidence.mul(flow_priors).div(denominator, axis='index')

    # plot the posterior partition for inspection
    flow_trips = flow_posteriors.mul(period_matrices.loc[period], axis='index')

    (flow_trips
     .join(zones.Comuna, on='origin_zone')
     .groupby('Comuna')
     .sum()
     .pipe(normalize_dataframe_rows)
     .sort_values('motorized')
     .plot(kind='bar', stacked=True, figsize=(14, 7), cmap='viridis', width=0.9, legend=False)
    )
    plt.title('Posterior')
    plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5), frameon=False)
    sns.despine()

    # export data
    raw_tower_mode = pd.DataFrame(W , index=towers.index.tolist(), columns= labeled_keys.keys())
    raw_tower_mode.index.name = 'tower'
    raw_tower_mode.to_csv('2020_results/flow_model_{}_tower_mode.csv.gz'.format(period))

    flow_mode.to_csv('2020_results/flow_model_{}_zone_mode.csv.gz'.format(period))

    (flow_posteriors
     .reset_index()
     .assign(period=period)
     .to_json('2020_results/modal_partition_zones_{}.json.gz'.format(period), 
              compression='gzip', orient='records', lines=True)
    )
    # done!
    plt.show()
    i+=1
print("Done...")
Actual period: afternoon_peak
Epoch 05 reached after 0.381 seconds, error: 2215.071165
Epoch 10 reached after 0.732 seconds, error: 2144.296019
Epoch 15 reached after 1.079 seconds, error: 2125.963913
Epoch 20 reached after 1.432 seconds, error: 2122.096909
Epoch 25 reached after 1.780 seconds, error: 2120.745935
Epoch 30 reached after 2.131 seconds, error: 2120.127930
Epoch 35 reached after 2.481 seconds, error: 2119.796490
Epoch 40 reached after 2.833 seconds, error: 2119.588659
Epoch 45 reached after 3.181 seconds, error: 2119.439359
Epoch 50 reached after 3.536 seconds, error: 2119.312903
Epoch 55 reached after 3.885 seconds, error: 2119.189509
Epoch 60 reached after 4.237 seconds, error: 2119.049726
Epoch 65 reached after 4.590 seconds, error: 2118.877166
Epoch 70 reached after 4.947 seconds, error: 2118.664118
Epoch 75 reached after 5.310 seconds, error: 2118.406898
Epoch 80 reached after 5.670 seconds, error: 2118.124417
Epoch 85 reached after 6.026 seconds, error: 2117.852153
Epoch 90 reached after 6.386 seconds, error: 2117.605809
Epoch 95 reached after 6.751 seconds, error: 2117.388844
Epoch 100 reached after 7.118 seconds, error: 2117.203358
Epoch 105 reached after 7.480 seconds, error: 2117.037167
Epoch 110 reached after 7.852 seconds, error: 2116.885624
Epoch 115 reached after 8.219 seconds, error: 2116.766585
Epoch 120 reached after 8.591 seconds, error: 2116.652995
Epoch 125 reached after 8.956 seconds, error: 2116.552677
Epoch 130 reached after 9.320 seconds, error: 2116.471589
Epoch 135 reached after 9.684 seconds, error: 2116.403248
Epoch 140 reached after 10.047 seconds, error: 2116.350922
Epoch 145 reached after 10.415 seconds, error: 2116.308286
Epoch 150 reached after 10.784 seconds, error: 2116.275202
Epoch 155 reached after 11.148 seconds, error: 2116.243248
Epoch 160 reached after 11.517 seconds, error: 2116.204825
Epoch 165 reached after 11.901 seconds, error: 2116.161449
Epoch 170 reached after 12.277 seconds, error: 2116.124374
Epoch 175 reached after 12.651 seconds, error: 2116.088940
Epoch 180 reached after 13.027 seconds, error: 2116.060983
Epoch 185 reached after 13.399 seconds, error: 2116.039804
Epoch 190 reached after 13.777 seconds, error: 2116.020967
Epoch 195 reached after 14.152 seconds, error: 2116.000434
Epoch 200 reached after 14.532 seconds, error: 2115.978046
Epoch 205 reached after 14.908 seconds, error: 2115.961357
Epoch 210 reached after 15.288 seconds, error: 2115.950828
Epoch 215 reached after 15.656 seconds, error: 2115.943157
Epoch 220 reached after 16.028 seconds, error: 2115.936076
Epoch 225 reached after 16.394 seconds, error: 2115.930204
Epoch 230 reached after 16.766 seconds, error: 2115.924251
Epoch 235 reached after 17.135 seconds, error: 2115.918077
Epoch 240 reached after 17.507 seconds, error: 2115.911020
Epoch 245 reached after 17.876 seconds, error: 2115.903397
Epoch 250 reached after 18.249 seconds, error: 2115.897186
Epoch 255 reached after 18.618 seconds, error: 2115.891899
Epoch 260 reached after 18.992 seconds, error: 2115.887343
Epoch 265 reached after 19.359 seconds, error: 2115.882724
Epoch 270 reached after 19.734 seconds, error: 2115.878128
Epoch 275 reached after 20.105 seconds, error: 2115.872479
Epoch 280 reached after 20.480 seconds, error: 2115.867352
Epoch 285 reached after 20.852 seconds, error: 2115.862594
Epoch 290 reached after 21.230 seconds, error: 2115.858803
Epoch 295 reached after 21.607 seconds, error: 2115.855471
Epoch 300 reached after 21.986 seconds, error: 2115.852187
Epoch 305 reached after 22.361 seconds, error: 2115.849262
Epoch 310 reached after 22.745 seconds, error: 2115.846344
Epoch 315 reached after 23.126 seconds, error: 2115.843305
Epoch 320 reached after 23.515 seconds, error: 2115.840136
Epoch 325 reached after 23.897 seconds, error: 2115.837939
/home/vnavarro/.local/lib/python3.7/site-packages/pyproj/crs/crs.py:55: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
  return _prepare_from_string(" ".join(pjargs))
/home/vnavarro/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:88: FutureWarning: 
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike
Actual period: afternoon_valley
Epoch 05 reached after 0.552 seconds, error: 2684.369192
Epoch 10 reached after 1.072 seconds, error: 2580.766147
Epoch 15 reached after 1.582 seconds, error: 2543.281727
Epoch 20 reached after 2.103 seconds, error: 2538.085459
Epoch 25 reached after 2.610 seconds, error: 2536.513662
Epoch 30 reached after 3.127 seconds, error: 2535.606330
Epoch 35 reached after 3.635 seconds, error: 2534.989150
Epoch 40 reached after 4.155 seconds, error: 2534.569052
Epoch 45 reached after 4.663 seconds, error: 2534.281728
Epoch 50 reached after 5.182 seconds, error: 2534.081099
Epoch 55 reached after 5.689 seconds, error: 2533.938431
Epoch 60 reached after 6.210 seconds, error: 2533.835249
Epoch 65 reached after 6.718 seconds, error: 2533.758487
Epoch 70 reached after 7.241 seconds, error: 2533.700036
Epoch 75 reached after 7.752 seconds, error: 2533.655189
Epoch 80 reached after 8.275 seconds, error: 2533.619713
Epoch 85 reached after 8.786 seconds, error: 2533.591270
Epoch 90 reached after 9.309 seconds, error: 2533.568481
Epoch 95 reached after 9.822 seconds, error: 2533.550366
Epoch 100 reached after 10.346 seconds, error: 2533.535915
Epoch 105 reached after 10.859 seconds, error: 2533.524134
Epoch 110 reached after 11.382 seconds, error: 2533.514308
Epoch 115 reached after 11.894 seconds, error: 2533.506007
Epoch 120 reached after 12.418 seconds, error: 2533.499028
Epoch 125 reached after 12.929 seconds, error: 2533.493230
Epoch 130 reached after 13.452 seconds, error: 2533.488377
Epoch 135 reached after 13.963 seconds, error: 2533.484256
Epoch 140 reached after 14.486 seconds, error: 2533.480739
Epoch 145 reached after 14.997 seconds, error: 2533.477685
Epoch 150 reached after 15.521 seconds, error: 2533.475022
/home/vnavarro/.local/lib/python3.7/site-packages/pyproj/crs/crs.py:55: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
  return _prepare_from_string(" ".join(pjargs))
/home/vnavarro/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:88: FutureWarning: 
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike
Actual period: morning_peak_1
Epoch 05 reached after 0.206 seconds, error: 1655.217781
Epoch 10 reached after 0.398 seconds, error: 1622.499485
Epoch 15 reached after 0.587 seconds, error: 1610.673680
Epoch 20 reached after 0.777 seconds, error: 1607.142544
Epoch 25 reached after 0.966 seconds, error: 1605.197782
Epoch 30 reached after 1.156 seconds, error: 1604.176295
Epoch 35 reached after 1.349 seconds, error: 1603.783037
Epoch 40 reached after 1.539 seconds, error: 1603.615244
Epoch 45 reached after 1.728 seconds, error: 1603.526824
Epoch 50 reached after 1.919 seconds, error: 1603.472938
Epoch 55 reached after 2.108 seconds, error: 1603.436724
Epoch 60 reached after 2.299 seconds, error: 1603.411156
Epoch 65 reached after 2.492 seconds, error: 1603.392446
Epoch 70 reached after 2.685 seconds, error: 1603.378022
Epoch 75 reached after 2.879 seconds, error: 1603.366373
Epoch 80 reached after 3.074 seconds, error: 1603.356798
Epoch 85 reached after 3.270 seconds, error: 1603.348911
Epoch 90 reached after 3.466 seconds, error: 1603.342405
Epoch 95 reached after 3.660 seconds, error: 1603.336874
Epoch 100 reached after 3.853 seconds, error: 1603.332083
Epoch 105 reached after 4.046 seconds, error: 1603.327941
Epoch 110 reached after 4.241 seconds, error: 1603.324316
Epoch 115 reached after 4.435 seconds, error: 1603.321221
Epoch 120 reached after 4.629 seconds, error: 1603.318552
Epoch 125 reached after 4.823 seconds, error: 1603.316167
Epoch 130 reached after 5.034 seconds, error: 1603.314030
Epoch 135 reached after 5.229 seconds, error: 1603.312060
Epoch 140 reached after 5.425 seconds, error: 1603.310237
Epoch 145 reached after 5.618 seconds, error: 1603.308602
/home/vnavarro/.local/lib/python3.7/site-packages/pyproj/crs/crs.py:55: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
  return _prepare_from_string(" ".join(pjargs))
/home/vnavarro/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:88: FutureWarning: 
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike
Actual period: morning_peak_2
Epoch 05 reached after 0.240 seconds, error: 1650.381704
Epoch 10 reached after 0.464 seconds, error: 1614.342978
Epoch 15 reached after 0.685 seconds, error: 1601.626360
Epoch 20 reached after 0.909 seconds, error: 1599.731065
Epoch 25 reached after 1.130 seconds, error: 1599.253990
Epoch 30 reached after 1.354 seconds, error: 1599.067486
Epoch 35 reached after 1.571 seconds, error: 1598.968758
Epoch 40 reached after 1.789 seconds, error: 1598.900118
Epoch 45 reached after 2.003 seconds, error: 1598.840086
Epoch 50 reached after 2.221 seconds, error: 1598.775533
Epoch 55 reached after 2.436 seconds, error: 1598.694408
Epoch 60 reached after 2.655 seconds, error: 1598.583317
Epoch 65 reached after 2.873 seconds, error: 1598.427325
Epoch 70 reached after 3.095 seconds, error: 1598.213805
Epoch 75 reached after 3.317 seconds, error: 1597.942295
Epoch 80 reached after 3.543 seconds, error: 1597.631600
Epoch 85 reached after 3.766 seconds, error: 1597.330882
Epoch 90 reached after 3.989 seconds, error: 1597.096805
Epoch 95 reached after 4.210 seconds, error: 1596.928832
Epoch 100 reached after 4.439 seconds, error: 1596.803744
Epoch 105 reached after 4.663 seconds, error: 1596.708583
Epoch 110 reached after 4.887 seconds, error: 1596.641331
Epoch 115 reached after 5.110 seconds, error: 1596.586017
Epoch 120 reached after 5.334 seconds, error: 1596.544161
Epoch 125 reached after 5.556 seconds, error: 1596.509807
Epoch 130 reached after 5.779 seconds, error: 1596.480830
Epoch 135 reached after 6.001 seconds, error: 1596.457228
Epoch 140 reached after 6.225 seconds, error: 1596.433034
Epoch 145 reached after 6.447 seconds, error: 1596.408258
Epoch 150 reached after 6.673 seconds, error: 1596.385851
Epoch 155 reached after 6.896 seconds, error: 1596.365745
Epoch 160 reached after 7.123 seconds, error: 1596.349537
Epoch 165 reached after 7.351 seconds, error: 1596.336458
Epoch 170 reached after 7.581 seconds, error: 1596.326102
Epoch 175 reached after 7.805 seconds, error: 1596.317765
Epoch 180 reached after 8.032 seconds, error: 1596.311411
Epoch 185 reached after 8.257 seconds, error: 1596.305148
Epoch 190 reached after 8.484 seconds, error: 1596.298887
Epoch 195 reached after 8.711 seconds, error: 1596.293423
Epoch 200 reached after 8.939 seconds, error: 1596.288524
Epoch 205 reached after 9.165 seconds, error: 1596.284214
Epoch 210 reached after 9.393 seconds, error: 1596.280739
Epoch 215 reached after 9.622 seconds, error: 1596.277815
Epoch 220 reached after 9.850 seconds, error: 1596.275113
Epoch 225 reached after 10.075 seconds, error: 1596.272676
Epoch 230 reached after 10.305 seconds, error: 1596.270482
Epoch 235 reached after 10.532 seconds, error: 1596.267884
Epoch 240 reached after 10.763 seconds, error: 1596.264931
Epoch 245 reached after 10.991 seconds, error: 1596.261680
Epoch 250 reached after 11.223 seconds, error: 1596.258717
Epoch 255 reached after 11.451 seconds, error: 1596.256134
Epoch 260 reached after 11.685 seconds, error: 1596.254335
Epoch 265 reached after 11.915 seconds, error: 1596.252597
Epoch 270 reached after 12.147 seconds, error: 1596.250726
Epoch 275 reached after 12.377 seconds, error: 1596.248865
Epoch 280 reached after 12.611 seconds, error: 1596.247209
/home/vnavarro/.local/lib/python3.7/site-packages/pyproj/crs/crs.py:55: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
  return _prepare_from_string(" ".join(pjargs))
/home/vnavarro/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:88: FutureWarning: 
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike
Actual period: morning_valley
Epoch 05 reached after 0.361 seconds, error: 2076.807695
Epoch 10 reached after 0.702 seconds, error: 2011.203825
Epoch 15 reached after 1.036 seconds, error: 1998.741739
Epoch 20 reached after 1.369 seconds, error: 1995.794877
Epoch 25 reached after 1.693 seconds, error: 1994.691369
Epoch 30 reached after 2.023 seconds, error: 1994.131766
Epoch 35 reached after 2.346 seconds, error: 1993.754969
Epoch 40 reached after 2.676 seconds, error: 1993.435616
Epoch 45 reached after 2.999 seconds, error: 1993.123685
Epoch 50 reached after 3.329 seconds, error: 1992.808690
Epoch 55 reached after 3.652 seconds, error: 1992.499555
Epoch 60 reached after 3.983 seconds, error: 1992.207253
Epoch 65 reached after 4.307 seconds, error: 1991.933442
Epoch 70 reached after 4.640 seconds, error: 1991.671024
Epoch 75 reached after 4.964 seconds, error: 1991.409508
Epoch 80 reached after 5.297 seconds, error: 1991.138986
Epoch 85 reached after 5.625 seconds, error: 1990.856519
Epoch 90 reached after 5.962 seconds, error: 1990.564577
Epoch 95 reached after 6.292 seconds, error: 1990.277809
Epoch 100 reached after 6.627 seconds, error: 1990.006418
Epoch 105 reached after 6.955 seconds, error: 1989.766353
Epoch 110 reached after 7.292 seconds, error: 1989.570537
Epoch 115 reached after 7.625 seconds, error: 1989.415293
Epoch 120 reached after 7.973 seconds, error: 1989.288201
Epoch 125 reached after 8.312 seconds, error: 1989.183792
Epoch 130 reached after 8.660 seconds, error: 1989.098488
Epoch 135 reached after 8.999 seconds, error: 1989.024437
Epoch 140 reached after 9.345 seconds, error: 1988.956694
Epoch 145 reached after 9.684 seconds, error: 1988.890250
Epoch 150 reached after 10.030 seconds, error: 1988.824028
Epoch 155 reached after 10.369 seconds, error: 1988.761504
Epoch 160 reached after 10.715 seconds, error: 1988.702907
Epoch 165 reached after 11.054 seconds, error: 1988.653460
Epoch 170 reached after 11.401 seconds, error: 1988.613531
Epoch 175 reached after 11.742 seconds, error: 1988.577982
Epoch 180 reached after 12.087 seconds, error: 1988.544378
Epoch 185 reached after 12.417 seconds, error: 1988.511687
Epoch 190 reached after 12.754 seconds, error: 1988.479331
Epoch 195 reached after 13.085 seconds, error: 1988.447949
Epoch 200 reached after 13.423 seconds, error: 1988.420541
Epoch 205 reached after 13.754 seconds, error: 1988.396548
Epoch 210 reached after 14.092 seconds, error: 1988.375332
Epoch 215 reached after 14.424 seconds, error: 1988.355890
Epoch 220 reached after 14.764 seconds, error: 1988.340377
Epoch 225 reached after 15.096 seconds, error: 1988.327698
Epoch 230 reached after 15.436 seconds, error: 1988.316619
Epoch 235 reached after 15.770 seconds, error: 1988.306493
Epoch 240 reached after 16.114 seconds, error: 1988.296914
Epoch 245 reached after 16.450 seconds, error: 1988.287226
Epoch 250 reached after 16.792 seconds, error: 1988.278022
Epoch 255 reached after 17.136 seconds, error: 1988.269460
Epoch 260 reached after 17.490 seconds, error: 1988.261933
Epoch 265 reached after 17.837 seconds, error: 1988.254980
Epoch 270 reached after 18.185 seconds, error: 1988.248637
Epoch 275 reached after 18.522 seconds, error: 1988.243178
Epoch 280 reached after 18.868 seconds, error: 1988.238002
Epoch 285 reached after 19.206 seconds, error: 1988.232757
Epoch 290 reached after 19.554 seconds, error: 1988.227154
Epoch 295 reached after 19.894 seconds, error: 1988.220630
Epoch 300 reached after 20.241 seconds, error: 1988.213465
Epoch 305 reached after 20.583 seconds, error: 1988.206687
Epoch 310 reached after 20.933 seconds, error: 1988.201224
Epoch 315 reached after 21.275 seconds, error: 1988.196936
Epoch 320 reached after 21.623 seconds, error: 1988.192947
Epoch 325 reached after 21.965 seconds, error: 1988.189366
Epoch 330 reached after 22.315 seconds, error: 1988.186065
Epoch 335 reached after 22.656 seconds, error: 1988.182633
Epoch 340 reached after 23.008 seconds, error: 1988.179224
Epoch 345 reached after 23.352 seconds, error: 1988.175786
Epoch 350 reached after 23.709 seconds, error: 1988.172276
Epoch 355 reached after 24.053 seconds, error: 1988.168681
Epoch 360 reached after 24.406 seconds, error: 1988.165473
Epoch 365 reached after 24.751 seconds, error: 1988.162949
Epoch 370 reached after 25.107 seconds, error: 1988.160870
/home/vnavarro/.local/lib/python3.7/site-packages/pyproj/crs/crs.py:55: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
  return _prepare_from_string(" ".join(pjargs))
/home/vnavarro/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:88: FutureWarning: 
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike
Actual period: night
Epoch 05 reached after 0.165 seconds, error: 1361.537424
Epoch 10 reached after 0.309 seconds, error: 1340.786752
Epoch 15 reached after 0.471 seconds, error: 1331.405356
Epoch 20 reached after 0.623 seconds, error: 1326.385900
Epoch 25 reached after 0.768 seconds, error: 1324.868999
Epoch 30 reached after 0.931 seconds, error: 1324.325475
Epoch 35 reached after 1.077 seconds, error: 1324.045471
Epoch 40 reached after 1.222 seconds, error: 1323.854642
Epoch 45 reached after 1.368 seconds, error: 1323.708882
Epoch 50 reached after 1.515 seconds, error: 1323.598726
Epoch 55 reached after 1.662 seconds, error: 1323.516168
Epoch 60 reached after 1.807 seconds, error: 1323.454836
Epoch 65 reached after 1.955 seconds, error: 1323.410035
Epoch 70 reached after 2.102 seconds, error: 1323.378666
Epoch 75 reached after 2.250 seconds, error: 1323.356084
Epoch 80 reached after 2.403 seconds, error: 1323.339349
Epoch 85 reached after 2.551 seconds, error: 1323.326633
Epoch 90 reached after 2.699 seconds, error: 1323.316319
Epoch 95 reached after 2.847 seconds, error: 1323.307791
Epoch 100 reached after 2.994 seconds, error: 1323.300679
Epoch 105 reached after 3.142 seconds, error: 1323.294776
Epoch 110 reached after 3.291 seconds, error: 1323.290189
Epoch 115 reached after 3.440 seconds, error: 1323.286484
Epoch 120 reached after 3.590 seconds, error: 1323.283206
Epoch 125 reached after 3.741 seconds, error: 1323.280161
Epoch 130 reached after 3.891 seconds, error: 1323.277874
Epoch 135 reached after 4.044 seconds, error: 1323.276073
Epoch 140 reached after 4.199 seconds, error: 1323.274628
Epoch 145 reached after 4.353 seconds, error: 1323.273430
/home/vnavarro/.local/lib/python3.7/site-packages/pyproj/crs/crs.py:55: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
  return _prepare_from_string(" ".join(pjargs))
/home/vnavarro/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:88: FutureWarning: 
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike
Actual period: night_valley
Epoch 05 reached after 0.170 seconds, error: 1408.954002
Epoch 10 reached after 0.326 seconds, error: 1379.798788
Epoch 15 reached after 0.485 seconds, error: 1373.356968
Epoch 20 reached after 0.648 seconds, error: 1371.649498
Epoch 25 reached after 0.808 seconds, error: 1370.818042
Epoch 30 reached after 0.970 seconds, error: 1370.398179
Epoch 35 reached after 1.127 seconds, error: 1370.138751
Epoch 40 reached after 1.284 seconds, error: 1369.958085
Epoch 45 reached after 1.441 seconds, error: 1369.830723
Epoch 50 reached after 1.599 seconds, error: 1369.739910
Epoch 55 reached after 1.757 seconds, error: 1369.682626
Epoch 60 reached after 1.917 seconds, error: 1369.644872
Epoch 65 reached after 2.079 seconds, error: 1369.618727
Epoch 70 reached after 2.244 seconds, error: 1369.601163
Epoch 75 reached after 2.407 seconds, error: 1369.589520
Epoch 80 reached after 2.572 seconds, error: 1369.581189
Epoch 85 reached after 2.736 seconds, error: 1369.574284
Epoch 90 reached after 2.900 seconds, error: 1369.568942
Epoch 95 reached after 3.068 seconds, error: 1369.564770
Epoch 100 reached after 3.236 seconds, error: 1369.561532
Epoch 105 reached after 3.399 seconds, error: 1369.559287
Epoch 110 reached after 3.562 seconds, error: 1369.557458
Epoch 115 reached after 3.724 seconds, error: 1369.555972
Epoch 120 reached after 3.891 seconds, error: 1369.554604
/home/vnavarro/.local/lib/python3.7/site-packages/pyproj/crs/crs.py:55: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
  return _prepare_from_string(" ".join(pjargs))
/home/vnavarro/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:88: FutureWarning: 
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike
Done...
In [ ]: